package risoe.syslab.fhnew.config;

/*
 * Copyright (c) 2012-2014, Technical University of Denmark (DTU)
 * All rights reserved.
 * 
 * The Flexhouse 2.0 platform ("this software") is licensed under the
 * BSD 3-clause license.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   - Neither the name of DTU nor the names of its contributors may be used to
 *     endorse or promote products derived from this software without specific
 *     prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE TECHNICAL UNIVERSITY OF DENMARK BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.io.Serializable;
import java.util.ArrayList;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

@SuppressWarnings("serial")
public class EnvironmentConfig implements Serializable {

  public static final String ENV_TAG="environment";
  private static final String NAME_ATTR="name";

  private String name;
  private ArrayList<SensorConfig> sensors; //sensors associated with the environment
  private ArrayList<ActuatorConfig> actuators; //actuators associated with the environment
  
  public String toString() {
    StringBuffer rv=new StringBuffer("EnvironmentConfig \""+name+"\" {\n");
    for (SensorConfig sc:sensors) {
      rv.append(sc.toString()+",");
    }
    for (ActuatorConfig ac:actuators) {
      rv.append(ac.toString()+",");
    }
    rv.append("}\n");
    return rv.toString();
  }
  
  public static EnvironmentConfig parse(Node in) {
    if ((in.getNodeType()==Node.ELEMENT_NODE) && (ENV_TAG.equals(in.getNodeName()))) {
      NamedNodeMap attrs=in.getAttributes();
      String rn;
      
      Node _envName=attrs.getNamedItem(NAME_ATTR);
      if (_envName!=null) {
        rn=_envName.getNodeValue();
      }
      else {
        throw new IllegalArgumentException(ENV_TAG+": Missing '"+NAME_ATTR+"' attribute.");
      }
      EnvironmentConfig rc=new EnvironmentConfig(rn);
      
      NodeList instruN=in.getChildNodes();
      for (int j=0;j<instruN.getLength();j++) {
        Node xn=instruN.item(j);
        if (xn.getNodeType()==Node.ELEMENT_NODE) {
          String nonm=xn.getNodeName();
          if (SensorConfig.SENSOR_TAG.equals(nonm)) {
            SensorConfig sc=SensorConfig.parse(xn);
            rc.addSensorConfig(sc);
          }
          else if (ActuatorConfig.ACTUATOR_TAG.equals(nonm)) {
            ActuatorConfig ac=ActuatorConfig.parse(xn);
            rc.addActuatorConfig(ac);
          }
        } //ELEMENT_NODE found
      } //j walk through child nodes
      
      return rc;
    } //correct node
    return null;
  }
  
  private EnvironmentConfig(String name) {
    sensors=new ArrayList<SensorConfig>();
    actuators=new ArrayList<ActuatorConfig>();
    this.name=name;
  }
  
  private void addSensorConfig(SensorConfig sc) {
    sensors.add(sc);
  }
  
  private void addActuatorConfig(ActuatorConfig ac) {
    actuators.add(ac);
  }
  
  public String getEnvironmentName() {
    return name;
  }
  
  public ArrayList<SensorConfig> getSensors() {
    return sensors;
  }
  
  public ArrayList<ActuatorConfig> getActuators() {
    return actuators;
  }
  
}

